﻿using System;
using System.Collections.Generic;
using System.Dynamic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace FlexFlow.Model
{
    /// <summary>
    /// 表示流程实例的状态枚举
    /// </summary>
    public enum ProcessInstanceState
    {
        /// <summary>
        /// 过程实例被创建，包括与过程状态相关的日期、工作流相关数据，
        /// 但是过程还没有满足条件，不能执行。
        /// </summary>
        Initiated,
        /// <summary>
        /// 过程实例已经执行，过程中的活动如果条件满足就可以执行。
        /// </summary>
        Running,
        /// <summary>
        /// 过程中的一个或者多个活动已经被执行。
        /// </summary>
        Active,
        /// <summary>
        /// 过程实例被静止，并且过程中的活动不能执行，
        /// 直到过程返回到running状态。
        /// </summary>
        Suspended,
        /// <summary>
        /// 过程实例满足结束条件；所有的完成后操作都将被执行（例如记录日志、或
        /// 者统计信息），并且销毁过程实例。
        /// </summary>
        Completed,
        /// <summary>
        /// 过程实例在正常结束前被停止；所有的完成后操作都将被执行
        /// （例如记录错误信息、或者恢复数据），并且销毁过程实例。
        /// </summary>
        Terminated
    }
    /// <summary>
    /// 表示工作流程实例
    /// </summary>
    public class ProcessInstance : PhysicalModel
    {
        /// <summary>
        /// 表示该流程实例的状态
        /// </summary>
        public ProcessInstanceState State { get; set; }
        /// <summary>
        /// 表示该实例所在的工作流ID
        /// </summary>
        public Guid ProcessId { get; set; }
        /// <summary>
        /// 表示该实例的创建者
        /// </summary>
        public Guid Creator { get; set; }
        /// <summary>
        /// 表示该实例的创建时间
        /// </summary>
        public DateTime CreateTime { get; set; }
        /// <summary>
        /// 表示该实例的最后流转时间
        /// </summary>
        public DateTime LastFlowTime { get; set; }
        /// <summary>
        /// 表示该实例流转到的活动实例
        /// </summary>
        public Guid CurrentActivityId { get; set; }
        /// <summary>
        /// 表示流程进入时使用的数据
        /// </summary>
        /// <remarks>
        /// 该数据为一个键值对集合，其中键为数据槽的Guid，值为数据槽的值
        /// </remarks>
        public KeyValuePair<Guid,Object>[] EnterData { get; set; }
    }
}
